use std::fs;
use std::path::{PathBuf};
use chrono::Local;
use log4rs::append::file::FileAppender;
use log4rs::append::console::ConsoleAppender;
use log4rs::Config;
use log4rs::config::{Appender, Logger, Root};
use log4rs::encode::pattern::PatternEncoder;
use log::{LevelFilter};

// 初始化日志的函数
pub fn init(level: LevelFilter, log_file_name: String, log_file_path: PathBuf, log_to_console: bool) {
    println!("log4rs init start"); // 输出初始化开始的提示信息

    let now = Local::now(); // 获取当前本地时间
    let filename = format!("{}_{}.log", log_file_name, now.format("%Y-%m-%d")); // 生成日志文件名

    let mut total_log_file_path = PathBuf::new(); // 创建一个新的路径缓冲区
    // 检查提供的日志文件路径是否为空
    if log_file_path.as_path().components().count() == 0 {
        total_log_file_path.push(dirs::home_dir().expect("Failed to get home directory")); // 获取用户主目录
        total_log_file_path.push("logs"); // 添加日志目录
    } else {
        total_log_file_path.push(log_file_path); // 如果有指定路径，直接添加
    }

    total_log_file_path.push(filename); // 将日志文件名添加到路径中
    println!("log4rs total_log_file_path: {:?}", total_log_file_path); // 输出最终日志文件路径

    // 检查日志目录是否存在，不存在则创建
    if !total_log_file_path.parent().unwrap().exists() {
        fs::create_dir_all(total_log_file_path.parent().unwrap()).map_err(|e| e.to_string()).unwrap(); // 创建目录
    }

    // 创建日志配置构建器
    let mut config_builder = Config::builder();

    // 根据 log_to_console 的值决定是否添加控制台输出
    if log_to_console {
        let stdout = ConsoleAppender::builder() // 创建控制台输出
            .encoder(Box::new(PatternEncoder::new("{d(%Y-%m-%d %H:%M:%S)} {T} {M} {L} {m}{n}"))) // 设置输出格式
            .build(); // 构建控制台输出

        // 将控制台输出添加到配置构建器
        config_builder = config_builder.appender(Appender::builder().build("stdout", Box::new(stdout)));
    }

    // 创建文件输出
    let requests = FileAppender::builder() // 创建文件输出
        .encoder(Box::new(PatternEncoder::new("{d(%Y-%m-%d %H:%M:%S)} {T} {M} {L} {m}{n}"))) // 设置输出格式
        .build(&total_log_file_path) // 构建文件输出
        .unwrap(); // 解包结果

    // 将文件输出添加到配置构建器
    config_builder = config_builder
        .appender(Appender::builder().build("requests", Box::new(requests)))
        .logger(Logger::builder().build("app::backend::db", LevelFilter::Info)) // 设置数据库日志级别
        .logger(Logger::builder()
            .appender("requests") // 将文件输出作为请求日志的输出
            .additive(false) // 设置不向父级记录
            .build("app::requests", level)); // 设置请求日志级别

    // 创建根配置
    let mut root_builder = Root::builder().appender("requests").build(level); // 添加文件输出
    if log_to_console {
        root_builder =  Root::builder().appender("requests").appender("stdout").build(level); // 添加文件输出
    }

    // 构建最终的日志配置
    let config = config_builder.build(root_builder).unwrap(); // 解包配置

    // 初始化日志配置
    log4rs::init_config(config).unwrap(); // 解包并应用配置
    println!("log4rs init end"); // 输出初始化结束的提示信息
}
